
import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Irena
 */
public class VerjetnostiOseba {
    
    private Connection conn;
    private int stevec = 0;
    PrintWriter pw = null;
    
    
    public VerjetnostiOseba() throws IOException {
        conn = Connector.vrniPovezavo();
        
        
    }
    
    public void zazeniPrimerjavo() throws SQLException, FileNotFoundException, IOException{
        
        File file = new File("example_testset5050.txt");
        Scanner input = new Scanner(file);
        
         while(input.hasNext()) {
            String nextLine = input.nextLine();
            StringTokenizer st = new StringTokenizer(nextLine, "\t");
            primerjajOsebi(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
         }
         
    }
    
    private void zapisiDatoteko(int i, int j, int rezultat) throws IOException{
        pw = new PrintWriter(new FileWriter("Primerjava.txt", true));
        pw.println(i + "\t" + j + "\t" + rezultat);
        pw.flush();
        if (pw != null)
            pw.close();
    
    }
    

    private void primerjajOsebi(int i, int j) throws SQLException, IOException {
        int utez = 0;
        
        //long milis = System.currentTimeMillis();
        
        utez = utez + primerjajSkupnePodatke(i,j);  
        utez = utez + preveriSkupnoInterakcijo(i,j);
        utez = utez + primerjajSkupnePredmete(i,j);  
        utez = utez + primerjajKljucneBesede(i, j);  
        utez = utez + primerjajKategorije(i, j); 
        utez = utez + sestevekInterakcij(i);        
        
        
        //System.out.println(System.currentTimeMillis() - milis);
        
        //System.out.println(primerjajSkupnePredmete(i,j) + ",   " + primerjajKljucneBesede(i, j) + ",   " + primerjajKategorije(i, j));
        
        stevec++;
        if(utez >= 10) {
            zapisiDatoteko(i, j, 1);
            System.out.println(i + ":" + j + " 1    " + stevec + ", " + utez);
            //System.out.println(i + ":" + j + " 1    " + stevec + ", " + utez + ", " + preveriSkupnoInterakcijo(i,j) + ", " + primerjajSkupnePredmete(i,j) + ", " + primerjajKljucneBesede(i, j) + ", " + primerjajKategorije(i, j) + ", " + sestevekInterakcij(i));
        } else {
            zapisiDatoteko(i, j, -1);
            System.out.println(i + ":" + j + " -1    " + stevec + ", " + utez);
            //System.out.println(i + ":" + j + " -1    " + stevec + ", " + utez + ", " + preveriSkupnoInterakcijo(i,j) + ", " + primerjajSkupnePredmete(i,j) + ", " + primerjajKljucneBesede(i, j) + ", " + primerjajKategorije(i, j) + ", " + sestevekInterakcij(i));
        }
        
        //System.out.println(i + ":" + j + " UTEŽ: " + utez + " ŠTEVEC: " + stevec);
        
        
    }

    private int primerjajSkupnePodatke(int i, int j) throws SQLException {
        Oseba tarca = vrniOsebo(i);
        Oseba zrtev = vrniOsebo(j);
        int tempUtez = 0;
        tempUtez = tempUtez + primerjajStarostOseb(tarca, zrtev);
        tempUtez = tempUtez + primerjajSpolaOseb(tarca, zrtev);
        tempUtez = tempUtez + primerjajIntereseOseb(tarca, zrtev);
        
        //System.out.println(primerjajStarostOseb(tarca, zrtev) + ",      " + primerjajSpolaOseb(tarca, zrtev) + ",      " + primerjajIntereseOseb(tarca, zrtev));
        
        return tempUtez;
    }
    
    
    private Oseba vrniOsebo(int id) throws SQLException {
        Oseba oseba = new Oseba();
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM is.user_profile where UserID = ?");
        ps.setInt(1, id);
        ResultSet rs = ps.executeQuery();
        rs.first();
        int starost = rs.getInt(2);
        int spol = rs.getInt(3);
        String interesi = rs.getString(5);
        oseba.setSpol(spol);
        oseba.setStarost(starost);
        oseba.setInteresi(interesi); 
        rs.close();
        ps.close();
        return oseba;
    }
    
    private int primerjajStarostOseb(Oseba tarca, Oseba zrtev) {
        if(tarca.getStarost() > 15 && tarca.getStarost() < 30) {
            return 4;
        }
        if(tarca.getStarost() > 29 && tarca.getStarost() < 40) {
            return 2;
        }
        return 0;
    }

    private int preveriSkupnoInterakcijo(int i, int j) throws SQLException {
        Interakcija preveri = vrniInterakcijo(i, j);
        
        if(preveri == null) {
            //System.out.println("prazno");
            return 0;
        }
        
        int utezSi = 0;
        
        if(preveri.getStKlikov() > 30 ) {
            utezSi = utezSi + 1; 
        }
        if(preveri.getStKlikov() > 60 ) {
            utezSi = utezSi + 3; 
        }
        if(preveri.getStKlikov() > 90 ) {
            utezSi = utezSi + 5;
        }
        if(preveri.getStKlikov() > 200 ) {
            utezSi = utezSi + 7;
        }
        
        if(preveri.getStRetweetov() > 0 ) {
            utezSi = utezSi + 1;
        }
        if(preveri.getStRetweetov() > 100 ) {
            utezSi = utezSi + 3;
        }
        if(preveri.getStRetweetov() > 250 ) {
            utezSi = utezSi + 5;
        }
        if(preveri.getStRetweetov() > 500 ) {
            utezSi = utezSi + 7;
        }
        if(preveri.getStRetweetov() > 700 ) {
            utezSi = utezSi + 9;
        }
        if(preveri.getStRetweetov() > 3000 ) {
            utezSi = utezSi + 20;   
        }
        
        
        if(preveri.getStKomentarjev() > 0 ) {
            utezSi = utezSi + 1;
        }
        if(preveri.getStKomentarjev() > 100 ) {
            utezSi = utezSi + 2; 
        }
        if(preveri.getStKomentarjev() > 200 ) {
            utezSi = utezSi + 5; 
        }
        if(preveri.getStKomentarjev() > 500 ) {
            utezSi = utezSi + 8; 
        }
        
        //System.out.println(utezSi);
        return utezSi;
    }
    
    private Interakcija vrniInterakcijo(int i, int j) throws SQLException {
        Interakcija in = null;
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM is.user_action where UserID = ? and actionDestinationUserID = ?");
        ps.setInt(1, i);
        ps.setInt(2, j);
        ResultSet rs = ps.executeQuery();

        if(rs.first()) {
            in = new Interakcija();
            int kliki = rs.getInt(4);
            int tweeti = rs.getInt(5);
            int komen = rs.getInt(6);
            in.setStKlikov(kliki);
            in.setStRetweetov(tweeti);
            in.setStKomentarjev(komen);
            System.out.println("interakcija!!");
        }
        ps.close();
        rs.close(); 
        return in;
    }
    
    private int sestevekInterakcij(int i) throws SQLException {
        ArrayList<Interakcija> interakcije = new ArrayList<Interakcija>();
        int temUtez = 0;
        int kliki = 0;
        int tweeti = 0;
        int komentarji = 0; 
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM is.user_action where UserID = ?");
        ps.setInt(1, i);
        ResultSet rs = ps.executeQuery();

        while(rs.next()) {
            Interakcija in = new Interakcija();
            
            in.setStKlikov(rs.getInt(4));
            in.setStRetweetov(rs.getInt(5));
            in.setStKomentarjev(rs.getInt(6));
            interakcije.add(in);
        }
        for(Interakcija p : interakcije) {
            kliki += p.getStKlikov();
            tweeti += p.getStRetweetov();
            komentarji += p.getStKomentarjev();
        }
        if(kliki > 0)
            temUtez += 1;
        if(kliki > 5)
            temUtez += 2;
        if(kliki > 10)
            temUtez += 3;
        
        if(tweeti > 0)
            temUtez += 1;
        if(tweeti > 25)
            temUtez += 2;
        if(tweeti > 50)
            temUtez += 3;
        if(tweeti > 100)
            temUtez += 4;
        
        if(komentarji > 0)
            temUtez += 1;
        if(komentarji > 0)
            temUtez += 2;
        if(komentarji > 0)
            temUtez += 3;
        
        ps.close();
        rs.close();
        return temUtez;
    }
    


    private int primerjajSkupnePredmete(int i, int j) throws SQLException {
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM is.user_sns where userId = ?");
        ps.setInt(1, i);
        
        ResultSet rs = ps.executeQuery();
        ArrayList<Integer> predmet_id_tarca = new ArrayList<Integer>();
        while(rs.next()) {
            predmet_id_tarca.add(rs.getInt(3));
        }
        rs.close();
        ps.close();
        
        PreparedStatement ps1 = conn.prepareStatement("SELECT * FROM is.user_sns where userId = ?");
        ps1.setInt(1, j);
        
        ResultSet rs1 = ps1.executeQuery();
        ArrayList<Integer> predmet_id_zrtev = new ArrayList<Integer>();
        while(rs1.next()) {
            predmet_id_zrtev.add(rs1.getInt(3));
        }
        int startLenght = predmet_id_tarca.size();
        predmet_id_tarca.removeAll(predmet_id_zrtev);
        int steviloSkupnihPredmetov = (startLenght - predmet_id_tarca.size());
        ps1.close();
        rs1.close();
        
        if(steviloSkupnihPredmetov > 0) 
            return 2;
        if(steviloSkupnihPredmetov > 2) 
            return 5;
        if(steviloSkupnihPredmetov > 4) 
            return 10;
        return 0;
    }

    private int primerjajSpolaOseb(Oseba tarca, Oseba zrtev) {
        if(tarca.getSpol() == 1 && zrtev.getSpol() == 2)
            return 1;
        return 0;
    }

    private int primerjajIntereseOseb(Oseba tarca, Oseba zrtev) {
        String interesiTarca[] = tarca.getInteresi().split(";");
        String interesiZrtev[] = zrtev.getInteresi().split(";");
        int tempUtez = 0;
        
        for(int i = 0; i < interesiTarca.length; i++) {
            for(int j = 0; j < interesiZrtev.length; j++) {
                if(interesiTarca[i].equals(interesiZrtev[j]) && !interesiTarca[i].equals("0")) {
                    tempUtez++;
                }
            }
        }
        
        if(tempUtez > 5) {
            return 5;
        }
        
        return tempUtez;
    }

    private int primerjajKljucneBesede(int tarca, int zrtev) throws SQLException {
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM is.user_key_word where UserId = ?");
        ps.setInt(1, tarca);
        ResultSet rs = ps.executeQuery();
        
        
        if(rs.first()) {
            String kljucneBesedeUporabnik[] = rs.getString(3).split(";");
            for(int i = 0; i < kljucneBesedeUporabnik.length; i++) {
                int endWordIndex = kljucneBesedeUporabnik[i].indexOf(":");
                kljucneBesedeUporabnik[i] = kljucneBesedeUporabnik[i].substring(0, endWordIndex);   
            }
            ps.close();
            rs.close();
            String kljucneBesedePredmet[] = null;
            PreparedStatement ps1 = conn.prepareStatement("SELECT * FROM is.item where ItemId = ?");
            ps1.setInt(1, zrtev);
            ResultSet rs1 = ps1.executeQuery();
            
            
            if(rs1.first()) {
                kljucneBesedePredmet = rs1.getString(3).split(";");
                ps1.close();
                rs1.close();
                int tempUtez = 0;
                for(int i = 0; i < kljucneBesedeUporabnik.length; i++) {
                    for(int j = 0; j < kljucneBesedePredmet.length; j++) {
                        if(kljucneBesedeUporabnik[i].equals(kljucneBesedePredmet[j])) {
                            tempUtez++;
                        }
                    }
                }
                
                if(tempUtez > 0) {
                    return 3;
                }
                if(tempUtez > 2) {
                    return 6;
                }
                if(tempUtez > 4) {
                    return 12;
                }
                return 0;
                
            }
            ps1.close();
            rs1.close();
            return 0;
            
        }
        ps.close();
        rs.close();
        return 0;
    }

    private int primerjajKategorije(int tarca, int zrtev) throws SQLException { 
        PreparedStatement ps = conn.prepareStatement("SELECT is.item.ItemCategory FROM is.item, is.user_sns where is.item.ItemID = is.user_sns.ItemId AND is.user_sns.UserId = ?");
        ps.setInt(1, tarca);
        ResultSet rs = ps.executeQuery();
        
        
        if(rs.first()) {
            ArrayList<String> kategorijeUporabnika = new ArrayList<String>();
            while(rs.next()) {
                kategorijeUporabnika.add(rs.getString(1));
            }
            ps.close();
            rs.close();
            
            PreparedStatement ps1 = conn.prepareStatement("SELECT * FROM is.item where ItemId = ?");
            ps1.setInt(1, zrtev);
            ResultSet rs1 = ps1.executeQuery();
            
            
            if(rs1.first()) {
                int tempUtez = 0;
                String[] kategorijePredmeta = rs1.getString(2).split("\\.");
                ps1.close();
                rs1.close();
                for(String kat : kategorijeUporabnika) {
                    String[] tempKat = kat.split("\\.");
                    tempUtez = tempUtez + primerjajKategoriji(kategorijePredmeta, tempKat);
                }
                if(tempUtez > 10) {
                    return 6;
                }
                if(tempUtez > 20) {
                    return 10;
                }
                if(tempUtez > 50) {
                    return 12;
                }
                if(tempUtez > 100) {
                    return 15;
                }
                return 0;
            }
            ps1.close();
            rs1.close();
            return 0;
            
        }
        ps.close();
        rs.close();
        return 0;
    }

    private int primerjajKategoriji(String[] kategorijePredmeta, String[] tempKat) {
        int tempUtez = 0;
        try {
            if(kategorijePredmeta[0].equals(tempKat[0])) {
                if(kategorijePredmeta[1].equals(tempKat[1])) {
                    if(kategorijePredmeta[2].equals(tempKat[2])) {
                        if(kategorijePredmeta[3].equals(tempKat[3])) {
                            tempUtez++;
                    }
                    tempUtez++;
                }
                tempUtez++;
            }
            tempUtez++;
        }
        return tempUtez;
        } catch (IndexOutOfBoundsException e){
            return tempUtez;
        }  
    }

    
    
}
